home *** CD-ROM | disk | FTP | other *** search
/ Atari Mega Archive 1 / Atari Mega Archive - Volume 1.iso / language / gemfsc18.lzh / AESSRC18.LZH / AESFUNCS / FRMNLDSU.C < prev    next >
C/C++ Source or Header  |  1992-04-06  |  6KB  |  199 lines

  1. /**************************************************************************
  2.  * FRMNLDSU.C - Some service routines used by frm_nl and frm_ds functions.
  3.  *************************************************************************/
  4.  
  5. #include "gemfast.h"
  6.  
  7. #ifndef NULL
  8.   #define NULL 0L
  9. #endif
  10.  
  11. #ifndef TRUE
  12.   #define TRUE  1
  13.   #define FALSE 0
  14. #endif
  15.  
  16. #define JUSTIFY_LEFT   0
  17. #define JUSTIFY_CENTER 2
  18.  
  19. /*-------------------------------------------------------------------------
  20.  * 
  21.  *-----------------------------------------------------------------------*/
  22.  
  23. static TEDINFO local_tedinfos[] = {
  24.   {NULL, NULL, NULL, 3, 6, 0, 0x11F0, 0,  0,   1,   1},
  25.   {NULL, NULL, NULL, 3, 6, 0, 0x11F0, 0,  0,   1,   1},
  26.   {NULL, NULL, NULL, 3, 6, 0, 0x11F0, 0,  0,   1,   1},
  27.   {NULL, NULL, NULL, 3, 6, 0, 0x11F0, 0,  0,   1,   1},
  28.   {NULL, NULL, NULL, 3, 6, 0, 0x11F0, 0,  0,   1,   1},
  29.   {NULL, NULL, NULL, 3, 6, 0, 0x11F0, 0,  0,   1,   1},
  30.   {NULL, NULL, NULL, 3, 6, 0, 0x11F0, 0,  0,   1,   1},
  31.   {NULL, NULL, NULL, 3, 6, 0, 0x11F0, 0,  0,   1,   1},
  32.   {NULL, NULL, NULL, 3, 6, 0, 0x11F0, 0,  0,   1,   1},
  33.   {NULL, NULL, NULL, 3, 6, 0, 0x11F0, 0,  0,   1,   1},
  34.   {NULL, NULL, NULL, 3, 6, 0, 0x11F0, 0,  0,   1,   1},
  35.   {NULL, NULL, NULL, 3, 6, 0, 0x11F0, 0,  0,   1,   1},
  36.   {NULL, NULL, NULL, 3, 6, 0, 0x11F0, 0,  0,   1,   1},
  37.   {NULL, NULL, NULL, 3, 6, 0, 0x11F0, 0,  0,   1,   1},
  38.   {NULL, NULL, NULL, 3, 6, 0, 0x11F0, 0,  0,   1,   1},
  39.   {NULL, NULL, NULL, 3, 6, 0, 0x11F0, 0,  0,   1,   1},
  40.   {NULL, NULL, NULL, 3, 6, 0, 0x11F0, 0,  0,   1,   1},
  41.   {NULL, NULL, NULL, 3, 6, 0, 0x11F0, 0,  0,   1,   1},
  42.   {NULL, NULL, NULL, 3, 6, 0, 0x11F0, 0,  0,   1,   1},
  43.   {NULL, NULL, NULL, 3, 6, 0, 0x11F0, 0,  0,   1,   1}
  44. };                                                                    
  45.  
  46. typedef struct ___size_sanity_check___ {
  47.     char x[FRM_DSMAXSTRINGS == (sizeof(local_tedinfos)/sizeof(TEDINFO))];
  48. } ___size_sanity_check___;
  49.  
  50. /*-------------------------------------------------------------------------
  51.  * set width of an object and all its children.
  52.  *-----------------------------------------------------------------------*/
  53.  
  54. void _FrmTrWidths(ptree, parent, width)
  55.     register OBJECT *ptree;
  56.     register int    parent;
  57.     register int    width;
  58. {
  59.     register int    curobj;
  60.     
  61.     ptree[parent].ob_width = width;
  62.     curobj = ptree[parent].ob_head;
  63.     
  64.     while (curobj != parent && curobj >= ROOT) {
  65.         ptree[curobj].ob_width = width;
  66.         curobj = ptree[curobj].ob_next;
  67.     }
  68. }
  69.  
  70. /*-------------------------------------------------------------------------
  71.  * attach string pointers from array to tedinfo pointers, 
  72.  * attach tedinfos to tree objects.
  73.  * if the objects pointed to by pobj are not G_xTEXT objects, it 
  74.  * attaches the strings directly to the objects and doesn't touch
  75.  * the tedinfo array at all.
  76.  *-----------------------------------------------------------------------*/
  77.  
  78. int _FrmDS2Obj(ppstr, pobj, pted, pwidth, maxobj)
  79.     register char    **ppstr;
  80.     register OBJECT  *pobj;
  81.     register TEDINFO *pted;
  82.     int              *pwidth;
  83.     int              maxobj;
  84. {
  85.     char             *pstr;
  86.     register int     len;
  87.     register int     counter;
  88.     register int     linecount = 0;
  89.     register int     width     = *pwidth;
  90.     int              sumwidth  = FALSE;
  91.     int              center_it;
  92.     
  93.     if (width == -1) {
  94.         sumwidth = TRUE;
  95.         width    = 0;
  96.     }
  97.     
  98.     if (pted == NULL) {
  99.         pted = local_tedinfos;
  100.     }
  101.  
  102.     for (counter = 0; counter < maxobj; ++counter) {
  103.         pstr = *ppstr;
  104.         if (pstr == NULL) {
  105.             pobj->ob_flags |= HIDETREE;
  106.         } else {
  107.             pobj->ob_flags &= ~HIDETREE;
  108.             if (*pstr == 0x7F) {
  109.                 center_it = TRUE;
  110.                 ++pstr;
  111.             } else {
  112.                 center_it = FALSE;
  113.             }
  114.             len  = strlen(pstr);
  115.             if (sumwidth) {
  116.                 width += len;
  117.             } else if (width < len) {
  118.                 width = len;
  119.             }
  120.             switch (pobj->ob_type & 0x00FF) {
  121.               case G_TEXT:
  122.               case G_BOXTEXT:
  123.               case G_FTEXT:
  124.               case G_FBOXTEXT:
  125.                 pobj->ob_spec   = (long)pted;
  126.                 pted->te_ptext  = pstr;
  127.                 pted->te_txtlen = len;
  128.                 pted->te_just   = (center_it) ? JUSTIFY_CENTER : JUSTIFY_LEFT;
  129.                 break;
  130.               default:
  131.                 pobj->ob_spec   = (long)pstr;
  132.                 break;
  133.             }
  134.             ++ppstr;
  135.             ++linecount;
  136.         }
  137.         ++pobj;
  138.         ++pted;
  139.     }
  140.     
  141.     *pwidth = width;
  142.     return linecount;
  143. }
  144.  
  145. /*-------------------------------------------------------------------------
  146.  * Go put \n chars back in all the places where we changed them to \0.
  147.  *-----------------------------------------------------------------------*/
  148.  
  149. void _FrmNLPatch(patch_array)
  150.     register char  **patch_array;
  151. {
  152.     register char   *thepatch;
  153.     
  154.     while (NULL != (thepatch = *patch_array)) {
  155.         *thepatch = '\n';
  156.         ++patch_array;
  157.     }
  158. }
  159.  
  160. /*-------------------------------------------------------------------------
  161.  * Divide \n-delimited string into set of \0-terminated strings.
  162.  *-----------------------------------------------------------------------*/
  163.  
  164. void _FrmNL2DS(strings, pointer_array, patch_array, maxstrings)
  165.     register char    *strings;
  166.     register char   **pointer_array;
  167.     register char   **patch_array;
  168.     register int      maxstrings;
  169. {
  170.     register int      counter;
  171.     register char     c;
  172.  
  173.     for (counter = 0; *strings && counter < maxstrings; ++counter) {
  174.         *pointer_array = strings;
  175.         for (;;) {
  176.             c = *strings;
  177.             if (c == '\0' || c == '\n') {
  178.                 break;
  179.             }
  180.             ++strings;
  181.         }
  182.         if (c == '\n') {
  183.             if (patch_array) {
  184.                 *patch_array++ = strings;
  185.             }
  186.             *strings++ = '\0';
  187.         }
  188.         if (**pointer_array == '\0') {
  189.             *pointer_array = " ";
  190.         }
  191.         ++pointer_array;
  192.     }
  193.     *pointer_array = NULL;
  194.     if (patch_array) {
  195.         *patch_array   = NULL;
  196.     }
  197. }
  198.  
  199.